package juc

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel

fun main() = runBlocking {
    // 创建三个通道，分别用于 1→2、2→3、3→1 的信号传递
    val channel1 = Channel<Unit>(1) // 线程1完成后通知线程2
    val channel2 = Channel<Unit>(1) // 线程2完成后通知线程3
    val channel3 = Channel<Unit>(1) // 线程3完成后通知线程1

    // 启动三个协程，形成循环
    val scope = CoroutineScope(Dispatchers.Default)

    // 协程1：等待线程3的信号，执行后通知线程2
    scope.launch(Dispatchers.IO) {
        while (true) { // 循环执行
            channel3.receive() // 等待线程3的信号
            println("线程1 开始执行（线程名：${Thread.currentThread().name}）")
            delay(1000) // 模拟任务耗时
            println("线程1 执行完毕")
            channel1.send(Unit) // 通知线程2
        }
    }

    // 协程2：等待线程1的信号，执行后通知线程3
    scope.launch(Dispatchers.IO) {
        while (true) {
            channel1.receive() // 等待线程1的信号
            println("线程2 开始执行（线程名：${Thread.currentThread().name}）")
            delay(1000)
            println("线程2 执行完毕")
            channel2.send(Unit) // 通知线程3
        }
    }

    // 协程3：等待线程2的信号，执行后通知线程1（启动第一轮）
    scope.launch(Dispatchers.IO) {
        while (true) {
            channel2.receive() // 等待线程2的信号
            println("线程3 开始执行（线程名：${Thread.currentThread().name}）")
            delay(1000)
            println("线程3 执行完毕")
            channel3.send(Unit) // 通知线程1，完成循环
        }
    }
// 先发送初始信号，启动第一轮循环（让线程1先执行）
    channel3.send(Unit)
    // 运行10秒后取消所有协程，结束程序
    delay(10000)
    scope.cancel() // 取消作用域，终止所有循环
    println("程序结束")
}